﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SCS.Business;
using SCS.Common.Models;
using SchoolCommunicationSystem.Models;
using System.IO;
using LinqToExcel;

namespace SchoolCommunicationSystem.Controllers
{
    public class ClassController : Controller
    {
        ClassServices _classServices = new ClassServices();

        #region ClassList
        /// <summary>
        /// get all classes information
        /// </summary>
        /// <param name="page">1</param>
        /// <param name="schoolYearIDList">0</param>
        /// <param name="classIDList">0</param>
        /// <param name="searchStringID">string</param>
        /// <param name="sort">name</param>
        /// <param name="sortDir">ASC</param>
        /// <returns>View</returns>
        public ActionResult CLassList(int page = 1, int schoolYearIDList = 0, int classIDList = 0, string searchStringID = "", string sort = "name", string sortDir = "ASC")
        {
            const int pageSize = 16;
            var totalRows = _classServices.CountClass(searchStringID);
            if (totalRows <= pageSize)
            {
                page = 1;
            }
            sortDir = sortDir.Equals("desc", StringComparison.CurrentCultureIgnoreCase) ? sortDir : "asc";
            IEnumerable<Class> classes = null;
            IEnumerable<ClassInSchoolYear> classinschoolyear = null;
            if (string.IsNullOrEmpty(searchStringID))
            {
                classes = _classServices.GetClassPaging(page, pageSize);
            }
            else
            {
                classes = _classServices.SearchClassPaging(page, pageSize, searchStringID);

            }
            classinschoolyear = _classServices.GetAllClassInSchoolYear(schoolYearIDList);
            var schoolYearName = _classServices.GetAllSchoolYear().Select(t => new SelectListItem()
            {
                Text = t.schoolYearName,
                Value = t.schoolYearID.ToString(),
            }).ToList();
            var data = new ClassAndSchoolModels()
            {
                TotalRows = totalRows,
                PageSize = pageSize,
                classes = classes,
                SchoolYearSelectList = schoolYearName,
                Classinschoolyear = classinschoolyear,
                schoolYearIDList = schoolYearIDList
            };
            return View(data);
        }
        #endregion

        #region DeleteClass
        /// <summary>
        /// delete a class
        /// </summary>
        /// <param name="id">ID</param>
        /// <param name="schoolyearID">schoolYearID</param>
        /// <returns>View</returns>
        public ActionResult DeleteClass(int id, int schoolyearID)
        {
            ClassInSchoolYear classname = _classServices.GetClassInSchoolYear(id, schoolyearID);
            Class _class = _classServices.GetClass(id);
            _classServices.DeleteClass(id, schoolyearID);
            return RedirectToAction("ClassList");
        }

        #endregion

        #region AddCLass
        /// <summary>
        /// Pre add a class
        /// </summary>
        /// <returns>View</returns>
        public ActionResult AddCLass()
        {
            if (ModelState.IsValid)
            {
                var teacherName = _classServices.GetAllTeacher().Select(t => new SelectListItem()
                {
                    Text = t.teacherName,
                    Value = t.teacherID.ToString(),
                }).ToList();

                var schoolYearName = _classServices.GetAllSchoolYear().Select(t => new SelectListItem()
                {
                    Text = t.schoolYearName,
                    Value = t.schoolYearID.ToString(),
                }).ToList();

                var model = new ClassAndSchoolModels { TeacherSelectList = teacherName, SchoolYearSelectList = schoolYearName };

                return View(model);
            }
            else

                return View();
        }

        /// <summary>
        /// Add a class
        /// </summary>
        /// <param name="classAndSchoolModels">ClassAndSchoolModels</param>
        /// <param name="clas">Class</param>
        /// <param name="classInSchoolYear">ClassInSchoolYear</param>
        /// <returns>View</returns>
        [HttpPost]
        public ActionResult AddClass(ClassAndSchoolModels classAndSchoolModels, Class clas, ClassInSchoolYear classInSchoolYear)
        {
            if (ModelState.IsValid)
            {
                classInSchoolYear.className = classAndSchoolModels._className;
                classInSchoolYear.schoolYearID = classAndSchoolModels._schoolYearID;
                clas.startDate = classAndSchoolModels._startDate;
                clas.teacherID = classAndSchoolModels._teacherID;

                _classServices.AddClass(clas, classInSchoolYear);
                string lastClass = classInSchoolYear.className;
                TempData["Msg"] = "Đã thêm " + lastClass + " vào danh sách các lớp thành công";
                return RedirectToAction("AddClass");
            }

            return View(clas);
        }
        #endregion

        #region UpdateClass
        /// <summary>
        /// Pre update a class
        /// </summary>
        /// <param name="id">ID</param>
        /// <param name="schoolyearID">schoolyearID</param>
        /// <returns>View</returns>
        public ActionResult UpdateClass(int id, int schoolyearID)
        {
            if (ModelState.IsValid)
            {
                var teacherName = _classServices.GetAllTeacher().Select(t => new SelectListItem()
                {
                    Text = t.teacherName,
                    Value = t.teacherID.ToString(),
                }).ToList();

                var schoolYearName = _classServices.GetAllSchoolYear().Select(t => new SelectListItem()
                {
                    Text = t.schoolYearName,
                    Value = t.schoolYearID.ToString(),
                }).ToList();
                ClassInSchoolYear classname = _classServices.GetClassInSchoolYear(id, schoolyearID);
                Class _class = _classServices.GetClass(id);
                var model = new UpdateClass { teacherID = _class.teacherID, _schoolYearID = schoolyearID, _classID = id, _className = classname.className, _startDate = _class.startDate, TeacherSelectList = teacherName, SchoolYearSelectList = schoolYearName, schoolYearIDList = schoolyearID };


                return View(model);
            }
            else

                return View();
        }

        /// <summary>
        /// Update a class
        /// </summary>
        /// <param name="classAndSchoolModels">UpdateClass</param>
        /// <returns>View</returns>
        [HttpPost]
        public ActionResult UpdateClass(UpdateClass classAndSchoolModels)
        {
            ClassInSchoolYear classInSchoolYear = _classServices.GetClassInSchoolYear(classAndSchoolModels._classID, classAndSchoolModels.schoolYearIDList);
            Class clas = _classServices.GetClass(classAndSchoolModels._classID);
            //Class startDate = _classServices.GetStartDate(classAndSchoolModels._startDate);
            if (ModelState.IsValid)
            {

                classInSchoolYear.className = classAndSchoolModels._className;
                classInSchoolYear.schoolYearID = classAndSchoolModels._schoolYearID;
                clas.startDate = classAndSchoolModels._startDate;
                clas.teacherID = classAndSchoolModels.teacherID;
                clas.classID = classAndSchoolModels._classID;

                _classServices.UpdateCLass(clas, classInSchoolYear);
                //string lastClass = classInSchoolYear.className;
                //TempData["Msg"] = "Đã thêm " + lastClass + " vào danh sách các lớp thành công";
                return RedirectToAction("ClassList");
            }

            return View(clas);
        }

        #endregion

        #region AssignSubject
        /// <summary>
        /// Pre assign subject
        /// </summary>
        /// <returns>view</returns>
        public ActionResult AssignSubject(int _classID = 0)
        {
            if (ModelState.IsValid)
            {
                var teacherName = _classServices.GetAllTeacher().Select(t => new SelectListItem()
                {
                    Text = t.teacherName,
                    Value = t.teacherID.ToString(),
                }).ToList();

                var className = _classServices.GetAllClassInSchoolYears().Select(t => new SelectListItem()
                {
                    Text = t.className,
                    Value = t.classID.ToString(),
                }).ToList();
                if (_classID == 0)
                {
                    _classID = Int32.Parse(className.FirstOrDefault().Value);
                }
                var subjectName = _classServices.GetAllSubject().Select(t => new SelectListItem()
                {
                    Text = t.subjectName,
                    Value = t.subjectID.ToString(),
                }).ToList();
                var teachingAssign = _classServices.GetTeachingAssign(_classID);
                List<AssigntSubject> assignSubject = new List<AssigntSubject>();
                for (int i = 0; i < 14; i++)
                {
                    AssigntSubject temp = new AssigntSubject();
                    if (teachingAssign.Count > i)
                    {
                        if (teachingAssign[i].subjectID.HasValue)
                        {
                            temp.SubjectID = teachingAssign[i].subjectID.Value;
                        }
                        temp.TeacherID = teachingAssign[i].teacherID;
                    }
                    assignSubject.Add(temp);
                }


                var model = new AssignSubjectAndTeacher
                {
                    _classID = _classID,
                    ClassIDToUpdate = _classID,
                    ClassSelectList = className,
                    TeacherSelectList = teacherName,
                    SubjectSelectList = subjectName,
                    teacherID1 = assignSubject[0].TeacherID
                    ,
                    teacherID2 = assignSubject[1].TeacherID

                    ,
                    teacherID3 = assignSubject[2].TeacherID,
                    teacherID4 = assignSubject[3].TeacherID,
                    teacherID5 = assignSubject[4].TeacherID
                  ,
                    teacherID6 = assignSubject[5].TeacherID
                  ,
                    teacherID7 = assignSubject[6].TeacherID
                  ,
                    teacherID8 = assignSubject[7].TeacherID
                  ,
                    teacherID9 = assignSubject[8].TeacherID
                  ,
                    teacherID10 = assignSubject[9].TeacherID,
                    teacherID11 = assignSubject[10].TeacherID
                  ,
                    teacherID12 = assignSubject[11].TeacherID
                  ,
                    teacherID13 = assignSubject[12].TeacherID,
                    teacherID14 = assignSubject[13].TeacherID,
                    subjectID1 = assignSubject[0].SubjectID,
                    subjectID2 = assignSubject[1].SubjectID,
                    subjectID3 = assignSubject[2].SubjectID,
                    subjectID4 = assignSubject[3].SubjectID,
                    subjectID5 = assignSubject[4].SubjectID,
                    subjectID6 = assignSubject[5].SubjectID,
                    subjectID7 = assignSubject[6].SubjectID,
                    subjectID8 = assignSubject[7].SubjectID,
                    subjectID9 = assignSubject[8].SubjectID,
                    subjectID10 = assignSubject[9].SubjectID,
                    subjectID11 = assignSubject[10].SubjectID,
                    subjectID12 = assignSubject[11].SubjectID,
                    subjectID13 = assignSubject[12].SubjectID,
                    subjectID14 = assignSubject[13].SubjectID

                };

                return View(model);
            }
            else

                return View();
        }

        /// <summary>
        /// Assign subject
        /// </summary>
        /// <param name="subjet">AssigntSubject</param>
        /// <param name="teachingAssignment">TeachingAssignment</param>
        /// <returns>view</returns>
        [HttpPost]
        public ActionResult AssignSubjected(AssignSubjectAndTeacher subject)
        {

            if (ModelState.IsValid)
            {
                if ((subject.subjectID1.HasValue && !subject.teacherID1.HasValue) || (!subject.subjectID1.HasValue && subject.teacherID1.HasValue))
                {
                    TempData["MsgError"] = "Bạn phải chọn cả môn và tên giáo viên. Vui lòng nhập lại!";
                    return RedirectToAction("AssignSubject", "Class", new { _classID = subject.ClassIDToUpdate });
                }
                if ((subject.subjectID2.HasValue && !subject.teacherID2.HasValue) || (!subject.subjectID2.HasValue && subject.teacherID2.HasValue))
                {
                    TempData["MsgError"] = "Bạn phải chọn cả môn và tên giáo viên. Vui lòng nhập lại!";
                    return RedirectToAction("AssignSubject", "Class", new { _classID = subject.ClassIDToUpdate });
                }
                if ((subject.subjectID3.HasValue && !subject.teacherID3.HasValue) || (!subject.subjectID3.HasValue && subject.teacherID3.HasValue))
                {
                    TempData["MsgError"] = "Bạn phải chọn cả môn và tên giáo viên. Vui lòng nhập lại!";
                    return RedirectToAction("AssignSubject", "Class", new { _classID = subject.ClassIDToUpdate });
                }
                if ((subject.subjectID4.HasValue && !subject.teacherID4.HasValue) || (!subject.subjectID4.HasValue && subject.teacherID4.HasValue))
                {
                    TempData["MsgError"] = "Bạn phải chọn cả môn và tên giáo viên. Vui lòng nhập lại!";
                    return RedirectToAction("AssignSubject", "Class", new { _classID = subject.ClassIDToUpdate });
                }
                if ((subject.subjectID5.HasValue && !subject.teacherID5.HasValue) || (!subject.subjectID5.HasValue && subject.teacherID5.HasValue))
                {
                    TempData["MsgError"] = "Bạn phải chọn cả môn và tên giáo viên. Vui lòng nhập lại!";
                    return RedirectToAction("AssignSubject", "Class", new { _classID = subject.ClassIDToUpdate });
                }
                if ((subject.subjectID6.HasValue && !subject.teacherID6.HasValue) || (!subject.subjectID6.HasValue && subject.teacherID6.HasValue))
                {
                    TempData["MsgError"] = "Bạn phải chọn cả môn và tên giáo viên. Vui lòng nhập lại!";
                    return RedirectToAction("AssignSubject", "Class", new { _classID = subject.ClassIDToUpdate });
                }
                if ((subject.subjectID7.HasValue && !subject.teacherID7.HasValue) || (!subject.subjectID7.HasValue && subject.teacherID7.HasValue))
                {
                    TempData["MsgError"] = "Bạn phải chọn cả môn và tên giáo viên. Vui lòng nhập lại!";
                    return RedirectToAction("AssignSubject", "Class", new { _classID = subject.ClassIDToUpdate });
                }
                if ((subject.subjectID8.HasValue && !subject.teacherID8.HasValue) || (!subject.subjectID8.HasValue && subject.teacherID8.HasValue))
                {
                    TempData["MsgError"] = "Bạn phải chọn cả môn và tên giáo viên. Vui lòng nhập lại!";
                    return RedirectToAction("AssignSubject", "Class", new { _classID = subject.ClassIDToUpdate });
                }
                if ((subject.subjectID9.HasValue && !subject.teacherID9.HasValue) || (!subject.subjectID9.HasValue && subject.teacherID9.HasValue))
                {
                    TempData["MsgError"] = "Bạn phải chọn cả môn và tên giáo viên. Vui lòng nhập lại!";
                    return RedirectToAction("AssignSubject", "Class", new { _classID = subject.ClassIDToUpdate });
                }
                if ((subject.subjectID10.HasValue && !subject.teacherID10.HasValue) || (!subject.subjectID10.HasValue && subject.teacherID10.HasValue))
                {
                    TempData["MsgError"] = "Bạn phải chọn cả môn và tên giáo viên. Vui lòng nhập lại!";
                    return RedirectToAction("AssignSubject", "Class", new { _classID = subject.ClassIDToUpdate });
                }
                if ((subject.subjectID11.HasValue && !subject.teacherID11.HasValue) || (!subject.subjectID11.HasValue && subject.teacherID11.HasValue))
                {
                    TempData["MsgError"] = "Bạn phải chọn cả môn và tên giáo viên. Vui lòng nhập lại!";
                    return RedirectToAction("AssignSubject", "Class", new { _classID = subject.ClassIDToUpdate });
                }
                if ((subject.subjectID12.HasValue && !subject.teacherID12.HasValue) || (!subject.subjectID12.HasValue && subject.teacherID12.HasValue))
                {
                    TempData["MsgError"] = "Bạn phải chọn cả môn và tên giáo viên. Vui lòng nhập lại!";
                    return RedirectToAction("AssignSubject", "Class", new { _classID = subject.ClassIDToUpdate });
                }
                if ((subject.subjectID13.HasValue && !subject.teacherID13.HasValue) || (!subject.subjectID13.HasValue && subject.teacherID13.HasValue))
                {
                    TempData["MsgError"] = "Bạn phải chọn cả môn và tên giáo viên. Vui lòng nhập lại!";
                    return RedirectToAction("AssignSubject", "Class", new { _classID = subject.ClassIDToUpdate });
                }
                if ((subject.subjectID14.HasValue && !subject.teacherID14.HasValue) || (!subject.subjectID14.HasValue && subject.teacherID14.HasValue))
                {
                    TempData["MsgError"] = "Bạn phải chọn cả môn và tên giáo viên. Vui lòng nhập lại!";
                    return RedirectToAction("AssignSubject", "Class", new { _classID = subject.ClassIDToUpdate });
                }
                List<AssigntSubject> listAssignSubject = new List<AssigntSubject>();
                var teachingAssign = _classServices.GetTeachingAssign(subject.ClassIDToUpdate);
                foreach (var item in teachingAssign)
                {
                    _classServices.DeleteTeachingAssign(item.teachingAssignmentID);
                }
                if (subject.subjectID1.HasValue && subject.teacherID1.HasValue)
                {
                    this._classServices.InsertTeachingAssignment(subject.ClassIDToUpdate, subject.subjectID1, subject.teacherID1);
                }


                if (subject.subjectID2.HasValue || subject.teacherID2.HasValue)
                {
                    this._classServices.InsertTeachingAssignment(subject.ClassIDToUpdate, subject.subjectID2, subject.teacherID2);
                }

                if (subject.subjectID3.HasValue || subject.teacherID3.HasValue)
                {
                    this._classServices.InsertTeachingAssignment(subject.ClassIDToUpdate, subject.subjectID3, subject.teacherID3);
                }

                if (subject.subjectID4.HasValue || subject.teacherID4.HasValue)
                {
                    this._classServices.InsertTeachingAssignment(subject.ClassIDToUpdate, subject.subjectID4, subject.teacherID4);
                }

                if (subject.subjectID5.HasValue || subject.teacherID5.HasValue)
                {
                    this._classServices.InsertTeachingAssignment(subject.ClassIDToUpdate, subject.subjectID5, subject.teacherID5);
                }

                if (subject.subjectID6.HasValue || subject.teacherID6.HasValue)
                {
                    this._classServices.InsertTeachingAssignment(subject.ClassIDToUpdate, subject.subjectID6, subject.teacherID6);
                }


                if (subject.subjectID7.HasValue || subject.teacherID7.HasValue)
                {
                    this._classServices.InsertTeachingAssignment(subject.ClassIDToUpdate, subject.subjectID7, subject.teacherID7);
                }

                if (subject.subjectID8.HasValue || subject.teacherID8.HasValue)
                {
                    this._classServices.InsertTeachingAssignment(subject.ClassIDToUpdate, subject.subjectID8, subject.teacherID8);
                }

                if (subject.subjectID9.HasValue || subject.teacherID9.HasValue)
                {
                    this._classServices.InsertTeachingAssignment(subject.ClassIDToUpdate, subject.subjectID9, subject.teacherID9);
                }

                if (subject.subjectID10.HasValue || subject.teacherID10.HasValue)
                {
                    this._classServices.InsertTeachingAssignment(subject.ClassIDToUpdate, subject.subjectID10, subject.teacherID10);
                }

                if (subject.subjectID11.HasValue || subject.teacherID11.HasValue)
                {
                    this._classServices.InsertTeachingAssignment(subject.ClassIDToUpdate, subject.subjectID11, subject.teacherID11);
                }

                if (subject.subjectID12.HasValue || subject.teacherID12.HasValue)
                {
                    this._classServices.InsertTeachingAssignment(subject.ClassIDToUpdate, subject.subjectID12, subject.teacherID12);
                }

                if (subject.subjectID13.HasValue || subject.teacherID13.HasValue)
                {
                    this._classServices.InsertTeachingAssignment(subject.ClassIDToUpdate, subject.subjectID13, subject.teacherID13);
                }

                if (subject.subjectID14.HasValue || subject.teacherID14.HasValue)
                {
                    this._classServices.InsertTeachingAssignment(subject.ClassIDToUpdate, subject.subjectID14, subject.teacherID14);
                }

                TempData["Msg"] = "Phân công giảng dạy thành công!";
                return RedirectToAction("AssignSubject", "Class", new { _classID = subject.ClassIDToUpdate });
            }

            return View();
        }

        #endregion

    }
}